package problem.year2021.february;

import java.util.*;

/**
 * 爱丽丝和鲍勃有不同大小的糖果棒：A[i] 是爱丽丝拥有的第 i 根糖果棒的大小，B[j] 是鲍勃拥有的第 j 根糖果棒的大小。
 * <p>
 * 因为他们是朋友，所以他们想交换一根糖果棒，这样交换后，他们都有相同的糖果总量。（一个人拥有的糖果总量是他们拥有的糖果棒大小的总和。）
 * <p>
 * 返回一个整数数组 ans，其中 ans[0] 是爱丽丝必须交换的糖果棒的大小，ans[1] 是 Bob 必须交换的糖果棒的大小。
 * <p>
 * 如果有多个答案，你可以返回其中任何一个。保证答案存在
 * <p>
 * 示例 1：
 * <p>
 * 输入：A = [1,1], B = [2,2]
 * 输出：[1,2]
 * <p>
 * 示例 2：
 * <p>
 * 输入：A = [1,2], B = [2,3]
 * 输出：[1,2]
 * <p>
 * 示例 3：
 * <p>
 * 输入：A = [2], B = [1,3]
 * 输出：[2,3]
 * <p>
 * 示例 4：
 * <p>
 * 输入：A = [1,2,5], B = [2,4]
 * 输出：[5,4]
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/fair-candy-swap
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * <p>
 * 假设爱丽丝的现有糖果综合为suma，鲍勃为sumb，两者交换的糖果为【x,y】，则必有suma-x+y=sumb-y+x====>>>>(suma-sumb)/2+y=x
 * 但指针遍历，将鲍勃数组放入集合set中，然后遍历爱丽丝，将每个x算出来的y放入集合，若是能放入，则表示有，交换机可
 */
public class February1 {
    public static void main(String[] args) {
        int[] a = new int[]{1, 2, 5};
        int[] b = new int[]{2, 4};

//        int[] ints = new Solution().fairCandySwap(a, b);
//        System.out.println(Arrays.toString(ints));
    }
}

class Solution {
    public int[] fairCandySwap(int[] A, int[] B) {
        long suma = Arrays.stream(A).sum();
        long sumb = Arrays.stream(B).sum();
        Arrays.sort(A);
        Arrays.sort(B);
        out:
        for (int i = 0; i < A.length; ++i) {
            for (int j = 0; j < B.length; ++j) {
                if ((A[i] - B[j]) * 2 + sumb == suma) {
                    return new int[]{A[i], B[j]};
                }
                if ((A[i] - B[j]) * 2 + sumb < suma) { // 小于，则证明A【i】小了，增加a[i]
                    continue out;
                }
                continue;
            }
        }
        return new int[]{0, 0};
    }
    // (suma-sumb)/2+y=x
    public int[] fairCandySwap2(int[] A, int[] B) {
        int sumA = Arrays.stream(A).sum();
        int sumB = Arrays.stream(B).sum();
        int delta = (sumA - sumB) / 2;
        Set<Integer> rec = new HashSet<Integer>();
        for (int num : A) {
            rec.add(num);
        }
        int[] ans = new int[2];
        for (int y : B) {
            int x = y + delta;
            if (rec.contains(x)) {
                ans[0] = x;
                ans[1] = y;
                break;
            }
        }
        return ans;
    }
}
